package cuboku.interfaz;


import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

import cuboku.cuboku.CubokuLight;
import cuboku.cuboku.CubokuObservable;

/**
 * Clase que hereda de JPanel y dibuja un cuboku
 * 
 * @author Alina Gheorghita
 */
public class PanelCubo extends JPanel implements Observer {
	
	private static final long serialVersionUID = 687157143356062941L;
	private static final int PIXELESLADO = 40;
	private Graphics _g;
	private CubokuObservable cuboku;

	
	public PanelCubo(CubokuObservable cuboku2) {
		super();
		_g = getGraphics();
		this.cuboku = cuboku2;
		this.setPreferredSize(new Dimension(500,400));
		this.setDoubleBuffered(true);
		this.setBorder(new TitledBorder("Representacion cubo"));
		pintaCubo(cuboku2);
    }

	public void pintaCubo(CubokuObservable cuboku2) {
		for(int i=0; i<6; i++)
			pintaCara(cuboku2.getCara(i), i);
		pintaLeyenda();
	}
	
    public void paint(Graphics g) {
   		_g = g;	
		pintaCubo(cuboku);
    	_g = getGraphics();
    }

	private void pintaCara(byte[] cara, int numCara) {
		int x, y, newX, newY;
		
		switch(numCara) {
			case 0: x = 0;             y = 3*PIXELESLADO; break;
			case 1: x = 3*PIXELESLADO; y = 0;             break;
			case 2: x = 3*PIXELESLADO; y = 3*PIXELESLADO; break;
			case 3: x = 3*PIXELESLADO; y = 6*PIXELESLADO; break;
			case 4: x = 6*PIXELESLADO; y = 3*PIXELESLADO; break;
			case 5: x = 9*PIXELESLADO; y = 3*PIXELESLADO; break;
			default: x = 0; y = 0;
		}
		
		for(int i=0; i<CubokuLight.LADO; i++) {
			for(int j=0; j<CubokuLight.LADO; j++) {
				newX = x + j*PIXELESLADO;
				newY = y + i*PIXELESLADO;
				pintaElem(cara[i*CubokuLight.LADO+j], newX, newY);				
			}
		}
	}

	private void pintaElem(byte elem, int x, int y) {
		String ruta = "/res/img" + ((elem<10) ? "0" : "") + elem + ".png";
		pintaImagen(ruta, x, y);
	}
	
	private void pintaLeyenda() {
		pintaImagen("/res/cuboku.jpg", 340, 260);
		pintaImagen("/res/borde.png", 160, 160);
	}
	
	private void pintaImagen(String ruta, int x, int y) {
		URL url = getClass().getResource(ruta);
		Image image =  this.getToolkit().getImage(url);
		if(_g != null) {
			boolean dibujado = false;
			do {
				dibujado = _g.drawImage(image, x, y, null);
			} while(!dibujado);
		}	
	}

	@Override
	public void update(Observable arg0, Object arg1) {
		pintaCubo(cuboku);
	}
    
}
